// 生命周期   ->避免悬垂引用(dangling reference)
// - 引用保持有效的作用域
// - 大多数时候生命周期是隐式的、可被推断的
// - 当引用的生命周期可能以不同的方式互相关联的时候，需要手动标注生命周期
//   借用检查器 - rust编译器

// 'a 就代表生命周期
// 生命周期的标注不会改变引用的生命周期的长度
// - 语法
//   - ' 开头
//   - 通常全小写且非常短   - 'a
//   - 在引用&的后面，使用空格将标注和引用类型分开

// 'a  就是x和y两个生命周期中较小的那个
fn longger_str<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

// 从函数返回引用的时候，返回类型的生命周期参数需要与其中一个参数的生命周期相匹配
// 如果返回的引用没有指向任何参数，那么他只能引用函数内创建的值
// - 这就是悬垂引用，该值在函数结束时就走出了作用域

// Struct 定义生命周期标注

// 应用：需要在每个应用上添加生命周期标注

// <'a, 'b, 'c, 'd, T, U, G, F>
struct ImportantExcerpt<'a, T> {
    part: &'a str,
    data: T,
}

impl<'a, T> ImportantExcerpt<'a, T> {
    fn level(&self) -> i32 {
        12
    }
}

//  静态生命周期
// - 持续时间是整个程序
// - 所有的字符串字面值都拥有'static生命周期

fn main() {
    let s:&'static str = "static lifetime";
    println!("{}", longger_str(String::from("kfccc").as_str(), "mccccc"));

    let ss = String::from("shajkgjs bdhfd dfahk dfuwb, hohsoahndoij ohasd dfihik!");

    let s_1 = ss.split(".").next().expect("error .");

    let im = ImportantExcerpt::<i32> { part: s_1,data:23 };
}

